package com.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Transient;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

import com.common.BaseModel;

@SuppressWarnings("serial")
@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Producto extends BaseModel {

	@Id
	@SequenceGenerator(name = "id", sequenceName = "ProductoSEQ")
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "id")
	@Column(unique = true)
	private Long id;

	@Column(length = 25, unique = true)
	private String codigoProducto;

	@Column(length = 80, unique = true)
	private String detalle;

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "unidadDeMedidaID")
	private UnidadDeMedida unidadDeMedida;

	@Column(precision = 20, scale = 2)
	private Double peso;

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "familiaID")
	private Familia familia;

	@Column(precision = 20, scale = 2)
	private Double stockMinimo;

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "marcaID")
	private Marca marca;

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "envaseID")
	private Envase envase;

	@Column(length = 500)
	private String descripcion;

	@Transient
	private byte[] imagen;

	@Column(length = 500)
	private String rutaArchivo;

	@Column(length = 300)
	private String nombreArchivo;

	public Producto(Long id, String codigoProducto, String detalle,
			UnidadDeMedida unidadDeMedida, Familia familia, Double stockMinimo,
			Marca marca, Envase envase, Double peso, String descripcion,
			byte[] imagen, String rutaArchivo, String nombreArchivo) {
		this.id = id;
		this.codigoProducto = codigoProducto;
		this.detalle = detalle;
		this.unidadDeMedida = unidadDeMedida;
		this.familia = familia;
		this.stockMinimo = stockMinimo;
		this.marca = marca;
		this.envase = envase;
		this.peso = peso;
		this.descripcion = descripcion;
		this.imagen = imagen;
		this.rutaArchivo = rutaArchivo;
		this.nombreArchivo = nombreArchivo;
	}

	public Producto() {
		this(null, null, null, null, null, null, null, null, null, null, null,
				null, null);
	}

	public Long getID() {
		return id;
	}

	public void setID(Long id) {
		this.id = id;
	}

	public String getCodigoProducto() {
		return codigoProducto;
	}

	public void setCodigoProducto(String codigoProducto) {
		this.codigoProducto = codigoProducto;
	}

	public String getDetalle() {
		return detalle;
	}

	public void setDetalle(String detalle) {
		this.detalle = detalle;
	}

	@OneToOne
	public UnidadDeMedida getUnidadDeMedida() {
		return unidadDeMedida;
	}

	public void setUnidadDeMedida(UnidadDeMedida unidadDeMedida) {
		this.unidadDeMedida = unidadDeMedida;
	}

	@OneToOne
	public Familia getFamilia() {
		return familia;
	}

	public void setFamilia(Familia familia) {
		this.familia = familia;
	}

	public Double getStockMinimo() {
		return stockMinimo;
	}

	public void setStockMinimo(Double stockMinimo) {
		this.stockMinimo = stockMinimo;
	}

	@OneToOne
	public Marca getMarca() {
		return marca;
	}

	public void setMarca(Marca marca) {
		this.marca = marca;
	}

	@OneToOne
	public Envase getEnvase() {
		return envase;
	}

	public void setEnvase(Envase envase) {
		this.envase = envase;
	}

	public Double getPeso() {
		return peso;
	}

	public void setPeso(Double peso) {
		this.peso = peso;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public byte[] getImagen() {
		return imagen;
	}

	public void setImagen(byte[] imagen) {
		this.imagen = imagen;
	}

	public String getRutaArchivo() {
		return rutaArchivo;
	}

	public void setRutaArchivo(String rutaArchivo) {
		this.rutaArchivo = rutaArchivo;
	}

	public String getNombreArchivo() {
		return nombreArchivo;
	}

	public void setNombreArchivo(String nombreArchivo) {
		this.nombreArchivo = nombreArchivo;
	}

}
